//κλάση για την διαχείριση με την βάση
//author: Κωνσταντινα Πολυχρονοπούλου
package radiostation;

import java.util.List;
import javax.persistence.*;
import javax.swing.JOptionPane;
import radiostation_POJOS.*;

public class DBManager {
     static EntityManager em;        
        public static void openConnection() {
         /* Χρήση exceptions για τον χειρισμό λαθών κατά την επικοινωνία με τη ΒΔ */
         try {
             /* Δημιουργία EntityManager */
             em =javax.persistence.Persistence.createEntityManagerFactory("RadiostationPU").createEntityManager();
         } catch(Exception e) {
             /* Εμφάνιση μηνύματος σφάλματος */
                System.out.println(e); 
                JOptionPane.showMessageDialog(null, "Αποτυχία σύνδεσης με τη ΒΔ!", "ΣΦΑΛΜΑ", JOptionPane.ERROR_MESSAGE);
            }
    }    
    public static EntityManager getEm() {
        return em;
    }
        public static void closeConnection() {
        /* Χρήση exceptions για τον χειρισμό λαθών κατά την επικοινωνία με τη ΒΔ */
        try {
             /* Κλείσιμο EntityManager */
             em.close();
        } catch(Exception e){ 
          System.out.println(e);
          JOptionPane.showMessageDialog(null, "Αποσύνδεση από τη ΒΔ!", "ERROR", JOptionPane.ERROR_MESSAGE);
    }
    }
            
  /* Μέθοδος αποθήκευσης νέου καλλιτέχνη */
public static boolean SaveArtist(Artist artist){
//* Χρήση exceptions για τον χειρισμό λαθών κατά την επικοινωνία με τη ΒΔ */   
    try {
        em.getTransaction().begin();
        em.persist(artist);
        em.getTransaction().commit();
        return true;
    }catch(Exception e){
        System.out.println(e); 
        return false;
    }
}
 
 /* Μέθοδος τροποποίησης καλλιτέχνη */
public static boolean ModifyArtist(Artist artist){
//* Χρήση exceptions για τον χειρισμό λαθών κατά την επικοινωνία με τη ΒΔ */
    try {
        em.getTransaction().begin();
        em.merge(artist);
        em.getTransaction().commit();
        return true;
    }catch(Exception e){
        System.out.println(e); 
        return false;
    }
}
        
/* Μέθοδος διαγραφής καλλιτέχνη */
public static boolean DeleteArtist(Artist artist){
//* Χρήση exceptions για τον χειρισμό λαθών κατά την επικοινωνία με τη ΒΔ */
    try {
        em.getTransaction().begin();
/* Merging the contents of the detached entity with the persistence context, and returns a reference to a managed entity */
        Artist a = em.merge(artist);
        em.remove(a);            
        em.getTransaction().commit();
        return true;
    }catch(Exception e){
        System.out.println(e);
        return false;
    }
}

public static Musicgenre identifyMusicgenreWithFkGerneId(int musicgenre_id){
    /* Τα πεδία της μεθόδου */
    Musicgenre musicgenre;

/* Δημιουργία query για εύρεση είδους μουσικής με βάση το ID του */
    Query findWithId = em.createNamedQuery("Musicgenre.findByMusicGenreId",Musicgenre.class);  
/* Χρήση exceptions για τον χειρισμό λαθών κατά την επικοινωνία με τη ΒΔ */
    try {
    findWithId.setParameter("music_genre_id", musicgenre_id);
    musicgenre = (Musicgenre) findWithId.getSingleResult();
    }catch(Exception e){
        e.printStackTrace();
        return null;
    }
    return musicgenre;
} 

 public static List getallartists() {
            javax.persistence.Query artistquery;
            List artists;
        artistquery =  em.createQuery("SELECT a FROM Artist a");
        artists=   artistquery.getResultList();
    return artists;
    }
}
